package Donnees;

import Metier.Objets.Produit;
import Metier.Objets.Stat;
import Metier.Objets.TypeProduit;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;
import java.util.HashSet;

public class DaoStat {

    /**
     * Fonction générant une requète SQL en fonction de la date donnée et de la
     * précision, celle ci est soit mois, soit jour, respectivement égal à 2 et 5
     * (Calendar.MONTH et Calendar.DATE)
     *
     * @param cal
     * @param precision
     * @return
     */
    private static String getDateRequete(Calendar cal, int precision) {
            String requete;
            if (precision == Calendar.MONTH) {
                    requete = "Select * from STAT_MOIS where mois_stat = '" + cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) < 10 ? "0" : "") + (cal.get(Calendar.MONTH) + 1) + "';";
            } else {
                    requete = "Select * from STAT_JOUR where date_stat = '" + cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) < 10 ? "0" : "") + (cal.get(Calendar.MONTH) + 1) + "-" + (cal.get(Calendar.DATE) < 10 ? "0" : "") + cal.get(Calendar.DATE) + "';";
            }
            
            return requete;
    }

    /**
     * Fonction générant une requète SQL en fonction du l'id produit donné
     *
     * @param id
     * @return
     */
    private static String getProduitRequete(int id) {
            return "Select * from STAT_PRODUIT where PRODUIT_id = " + id + "';";
    }

    /**
     * Fonction éxécutant une requète SQL donnée
     *
     * @param requete
     * @return
     * @throws SQLException
     */
    private static HashSet<Stat> getStatSet(String requete) throws SQLException {
            HashSet<Stat> stats = new HashSet<>();

            Connection connection = ConnectionFactory.getConnection();
            Statement statement = connection.createStatement();

            ResultSet rs = statement.executeQuery(requete);

            while (rs.next()) {
                Produit p = new DaoProduit().chercher(rs.getInt("PRODUIT_id"));
                stats.add(new Stat(rs.getString("libelle"), rs.getInt("quantite_vendue"), rs.getInt("quantite_cuit"), rs.getInt("quantite_perdue"), p.getType() == TypeProduit.BOISSON));
            }

            DbUtil.close(rs);
            DbUtil.close(statement);
            DbUtil.close(connection);

            return stats;
    }

    /**
     * Fonction retournant l'ensemble des stats de la date donnée
     *
     * @param cal
     * @param precision
     * @return
     * @throws SQLException
     */
    public static HashSet<Stat> getStatDate(Calendar cal, int precision) throws SQLException {
            return getStatSet(getDateRequete(cal, precision));
    }

    /**
     * Fonction retournant l'ensemble des stats du produit donné
     *
     * @param id
     * @return
     * @throws SQLException
     */
    public static HashSet<Stat> getStatProduit(int id) throws SQLException {
            return getStatSet(getProduitRequete(id));
    }

}
